#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lista.h"

/*      typedef enum boolean_e { false=0, true=1 } bolean;



      typedef enum tipo_e {
            sin_tipo=0,
            tipo_int=1,
            tipo_double=2,
            tipo_string=3
      } tipo;

      typedef struct lista_t {
            enum tipo_e tipo_dato;
            struct nodo_t *primero;
      } __attribute__((__packed__)) lista;

      typedef struct nodo_t {
            struct nodo_t *siguiente;
            void *dato;
      } __attribute__((__packed__)) nodo;*/

/*** Declaracion de funciones de lista ***/


lista * listaCrear(){
	lista* nueva = (lista*)malloc(sizeof(lista));
	return nueva;
}

void  listaInsertar(lista * l, enum tipo_e tipo, void* dato){

	nodo *siguiente;
	if (l->primero == 0) {
		l->tipo_dato = tipo;
		siguiente = 0;
	} else {
		if (tipo == l->tipo_dato){
			siguiente = l->primero;
		} else {
			//jmp fin
		}
	}
	
	nodo *nuevo_nodo = (nodo*)malloc(sizeof(nodo));
	int *nuevo_dato = (int*)malloc(sizeof(int));
	*nuevo_dato = *(int*)dato;
	nuevo_nodo->dato = nuevo_dato;
	nuevo_nodo->siguiente = siguiente;
	l->primero = nuevo_nodo;

	//printf("entre\n");		
	/*nodo *nuevo_nodo = (nodo*)malloc(sizeof(nodo));
	nuevo_nodo->dato = dato;
	if(l->primero == 0){
		//printf("primero\n");
		l->tipo_dato = tipo;
		l->primero = nuevo_nodo;
	} else {
		//printf("no es el primero\n");
		nodo *aux = l->primero;
		//int *num = (int*)(aux->dato);
		//printf("dato anterior: %i\n", *num);
		while(aux->siguiente != 0){
			//printf("dato anterior: %p\n", (aux->dato));
			aux = (aux->siguiente)->siguiente;
		}
		aux->siguiente = nuevo_nodo;
	}*/
}


void  listaDestruir(lista * l){
	nodo *p_lista = l->primero;
	free(l);
	while(p_lista != 0){
		nodo *aux = p_lista;
		p_lista = p_lista->siguiente;
		free(aux->dato);
		free(aux);
	}
}


void imprimirAux(nodo *p_nodo, FILE* file){
	if(p_nodo->siguiente != 0){
		imprimirAux(p_nodo->siguiente, file);
	}
	int *num = (int*)(p_nodo->dato);
	fprintf(file,"[%d]",*num);
}


void  listaImprimir(lista  * l, char *archivo){
	if(l->primero != 0){
		FILE *file = fopen(archivo,"a+");
		imprimirAux(l->primero, file);
		fclose(file);
	}
}


int main(){
	char *s = "hola";
	int tam = strlen(s);
	char *sm = (char*)malloc((tam*sizeof(char))+1);
	*sm = s;
	printf("%s",sm);

	free(sm);

/*
	lista *l = listaCrear();
	int *n = (int*)malloc(sizeof(int));
	*n = 5;
	int *n2 = (int*)malloc(sizeof(int));
	*n2 = 6;
	listaInsertar(l, tipo_int, n);
	listaInsertar(l, tipo_int, n2);
	char *archivo = "/home/matias/Documentos/UBA/ORGAII/tp1/entregable/solucion/salida";
	listaImprimir(l, archivo);
	listaDestruir(l);
	free(n);
	free(n2);*/
	return 0;
}

